<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script type="text/javascript">
    function Hero(name){
        return this.name = name;
    }

    // 不使用new关键字来调用构造器函数
    var h = Hero('Leonardo');
    console.log(typeof h);

    // 访问就会报错
    // console.log(typeof h.name);

    // 因为在Hero中使用了this关键字，而且使用h来调用它的时候并没有使用new关键字，所以h函数内部的变量就成了全局变量。
    console.log(name);
    console.log(window.name);

    // 如果我们使用new关键字来调用相同的构造器函数，我们就会创建一个新的对象。并且this值也会自动指向该对象。

    var h2 = new Hero('Michelanglo');
    console.log(typeof h2);

    console.log(h2.name);


    // 宿主内置的全局方法
    console.log(parseInt('101 dalmatians'));
    // 可以使用window来访问
    console.log(window.parseInt('101 dalmatians'));
    // 如果是在所有函数之外的，也可以使用this来访问
    console.log(this.parseInt('101 dalmatians'));



    // 4.1.9例子
    console.log(h2.constructor);

    // 由于构造器属性所引用的是一个函数，因为我们可以利用他来创建一个其他的新对象
    // 使用new操作符创建一个新的构造器函数，然后调用其构造器属性，新建一个name属性
    var h3 = new h2.constructor('Rafaello');
    console.log(h3.name);

    //另外，如果对象是通过对象文本表示法所创建的，那么实际上他就是由内键构造器Object()函数所创建的（关于这一点，我们稍后还会做详细介绍）。
    var o = {};
    console.log(o.constructor);
    console.log(typeof o.constructor);
    
</script>
</body>
</html>
